<html>
  <head>
    <title>本地化 Localization</title>
  </head>
  <body>
    <script>
      // 本地化

              /*
                   ABP的本地化系统无缝集成到 Microsoft.Extensions.Localization包中，并兼容Microsoft的本地化文档。
                   它增加了一些有用的特性和增强功能，使其更容易在现实生活中的应用场景中使用。
              */

              /*
                 一、安装

                        默认情况下，此软件包已经与启动模板一起安装。所以，大多数时候，你不需要手动安装它。

                        你可以使用ABP CLI将Volo. Abp.Localize包安装到你的项目中。
                        在要安装软件包的.csproj文件夹中执行以下命令：

                              abp add-package Volo.Abp.Localization

                        然后你可以将AbpLocalizationModule依赖项添加到你的模块中：
                              using Volo.Abp.Modularity;
                              using Volo.Abp.Localization;

                              namespace MyCompany.MyProject
                              {
                                  [DependsOn(typeof(AbpLocalizationModule))]
                                  public class MyModule : AbpModule
                                  {
                                      //...
                                  }
                              }
              */


              /*
                  二、创建本地化资源

                          本地化资源用于将相关的本地化字符串组合在一起，并将它们与应用程序的其他本地化字符串分开。

                          模块通常定义"自己的本地化资源"。

                          本地化资源只是一个"普通类"

                          eg：
                              [DependsOn(typeof(AbpLocalizationModule))]
                              public class MyModule : AbpModule
                              {
                                  public override void ConfigureServices(ServiceConfigurationContext context)
                                  {
                                      Configure<AbpVirtualFileSystemOptions>(options =>
                                      {
                                          // "YourRootNameSpace" 是你项目的根命名空间. 如果你的根命名空间时空的，它也可以是空的
                                          options.FileSets.AddEmbedded<MyModule>("YourRootNameSpace");
                                      });

                                      // 配置本地化选项
                                      Configure<AbpLocalizationOptions>(options =>
                                      {
                                          // 声明一个本地化资源
                                          options.Resources
                                              .Add<TestResource>("en")
                                              .AddVirtualJson("/Localization/Resources/Test");
                                      });
                                  }
                              }

                           在这个例子中；
                           
                                  1、添加了一个以“en”（英语）作为默认区域性的新本地化资源。

                                  2、使用Json文件来粗出本地化字符串

                                  3、Json文件使用 AbpVirtualFileSystemOptions 嵌入的程序集中（请阅读虚拟文件系统）

                          JSON文件位于“/Localize/Resources/Test”项目文件夹下，如下所示：

                                  {
                                    "culture": "en",
                                    "texts": {
                                      "HelloWorld": "Hello World!"
                                    }
                                  }

                                  1、每个本地化文件都应该为该文件定义culture代码（如“en”或“en-US”）

                                  2、texts部分仅包含本地化字符串的键值集合（键也可能有空格）。
              */

              /*
                  三、默认资源
                            AbpLocalizationOptions.DefaultResourceType 可以设置为资源类型，因此在未指定本地化资源时使用：

                              Configure<AbpLocalizationOptions>(options =>
                              {
                                  options.DefaultResourceType = typeof(TestResource);
                              });

                              应用程序启动模板将DefaultResourceType设置为应用程序的本地化资源。
              */

              /*
                  四、简短的本地化名称

                            客户端(JavaScript)端也提供本地化资源。
                            因此，为本地化资源设置一个短名称可以轻松使用本地化文本。
                            例子：
                                
                                [LocalizationResourceName("Test")]
                                public class TestResource
                                {
                                }
                                              
              */

              /*
                  五、从其他资源继承
                            资源可以从其他资源继承，这使得在不引用现有资源的情况下重用现有本地化字符串成为可能。
                            使用 [InheritResource]特性，可从其他资源类型中集成本地化字符串。
                            例子：

                            [InheritResource(typeof(AbpValidationResource))]  
                            public class TestResource
                            {
                            }

                            通过配置AbpLocalizationOptions替代继承：
                            services.Configure<AbpLocalizationOptions>(options =>
                            {
                                options.Resources
                                    .Add<TestResource>("en") // 声明一个文化代码为 "en" 的本地化字眼
                                    .AddVirtualJson("/Localization/Resources/Test") // 使用Json文件来粗出本地化字符串,并通过虚拟文件系统将Json文件嵌入到程序集中
                                    .AddBaseTypes(typeof(AbpValidationResource)); // 从现有本地化资源类型中集成本地化字符串
                            });

                            一个资源可以从多个资源集成。

                            如果新资源定义了相同的本地化字符串，它会覆盖该字符串。
              */

              /*
                  六、扩展现有资源

                          从其他资源继承会创建一个新资源，而五需修改现有资源。
                          在某些情况下，你可能希望不创建新资源，而是直接扩展现有资源。

                          eg:
                                services.Configure<AbpLocalizationOptions>(options =>
                                {
                                    options.Resources
                                        .Get<TestResource>()
                                        .AddVirtualJson("/Localization/Resources/Test/Extensions");  // 通过往虚拟文件系统中添加显得Json文件夹路径来扩展现有资源
                                }); 
                                
                                如果扩展文件定义了相同的本地化字符串，它会覆盖该字符串。
              */

              /*
                  七、获取本地化文本

                          获取本地化文本是非常标准的。

                          1、在一个类获取本地化文本最简单的方法：
                                          只需要注入IStringLocalizer<T> 服务并使用它  
                                            
                                          eg: 
                                              //  某个服务实现类中
                                              public class MyService : ITransientDependency
                                              {
                                                  private readonly IStringLocalizer<TestResource> _localizer;

                                                  public MyService(IStringLocalizer<TestResource> localizer)
                                                  {
                                                      _localizer = localizer; // 注入本地化资源服务
                                                  }

                                                  public void Foo()
                                                  {
                                                      var str = _localizer["HelloWorld"];  // 直接通过key获取本地化文本。
                                                  }
                                              }
              */

              /*
                    八、参数化本地化文本
                            格式化参数可以在本地化key之后传递。

                            如果你的本地化文本为  "Hello {0}, welcome!"， 那么你可以经 {0} 参数传递给本地化器，

                            eg:   _localizer["HelloMessage","John"]
              */

              /*
                    九、在Razor视图中使用

                            在Razor视图中使用 IHtmlLocalizer<T>  
                              eg:
                                  @inject IHtmlLocalizer<TestResource> Localizer

                                  <h1>@Localizer["HelloWorld"]</h1>
              */

              /*
                    十、特殊基类

                            一些ABP基类提供名为 "L" 的属性，以轻松地使用本地化服务。
                            
                            例如： 在应用程序服务类中，你可以这样使用本地化文本：
                                
                              using System.Threading.Tasks;
                              using MyProject.Localization;
                              using Volo.Abp.Application.Services;

                              namespace MyProject
                              {
                                  public class TestAppService : ApplicationService
                                  {
                                      public TestAppService()
                                      {
                                          LocalizationResource = typeof(MyProjectResource);  // 设置本地化资源类型，以便可以使用 "L" 属性。
                                      }

                                      public async Task DoIt()
                                      {
                                          var str = L["HelloWorld"]; // 直接使用 "L" 属性获取本地化文本。
                                      }
                                  }
                              }

                            当你在构造函数中设置 LocalizationResource 时，ApplicationService类在你使用L属性时使用该资源类型，就像在 DoIt() 方法中一样。

                            在每个应用程序服务类中设置 LocalizationResource 可能会很乏味繁琐。
                            你可以创建一个抽象的基本应用程序服务类，将其设置在那里并从该基类派生你的应用程序服务。

                            当你使用启动模板创建一个解决方案时，这已经实现了。
                            因此，你可以直接简单地使用 "L" 属性。


                            using System.Threading.Tasks;

                            namespace MyProject
                            {
                                public class TestAppService : MyProjectAppService // 此基类已经设置了 LocalizationResource 属性，继承后可直接使用 "L" 属性。


                                {
                                    public async Task DoIt()
                                    {
                                        var str = L["HelloWorld"];
                                    }
                                }
                            }

                            
                            L属性可可以用于其他一些基类，  例如：  AbpController 和 AbpPageModel
                                                
              */


              /*
                   十一、客户端本地化

                          请参阅以下文档以了解如何在JavaScript端重用相同的本地化文本:
                          
                                    MVC/Razor Pages UI的本地化
              */


    </script>
  </body>
</html>